package com.triones.api.service.interlace;

import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.triones.api.entity.interlace.bo.*;
import com.triones.api.entity.interlace.bo.request.PhysicalCardFeesRequest;
import com.triones.api.entity.interlace.vo.*;
import com.triones.api.entity.interlace.vo.response.InfinityCardDetailsResponse;
import com.triones.api.entity.interlace.vo.response.PhysicalCardFeesResponse;
import com.triones.api.entity.param.BankCardTxnParams;

import java.util.List;

/**
 * interlace 法定货币相关接口
 */
public interface InterlaceFiatService {

    /**
     * 获取所有预算组
     * @return
     */
    List<CustomInterlaceBudgetVO> budgetListGroup();

    /**
     * 创建预算
     * @param bo
     * @return
     */
    boolean createBudget(InterlaceBudgetBO bo);

    /**
     * 修改预算组名称
     * @param id
     * @param name
     * @return
     */
    boolean updateBudgetName(Long id, String name);

    /**
     * 获取签约的卡bin信息
     * @return
     */
    List<InterlaceCardBinsVO> getCardBinList(String type);

    /**
     * 获取实体卡邮寄费用
     * @param request
     * @return
     */
    PhysicalCardFeesResponse getPhysicalCardFees(PhysicalCardFeesRequest request);

    /**
     * 实体卡邮寄
     * @param bo
     * @return
     */
    boolean physicalCardShip(PhysicalCardShipBO bo);

    /**
     * 开预算卡
     * @param bo
     * @return
     */
    boolean openBudgetCard(InterlaceInfinityBudgetCardBO bo);

    /**
     * 开预付卡
     * @param bo
     * @return
     */
    boolean openPrepaidCard(InterlaceInfinityPrepaidCardBO bo);

    /**
     * 获取卡cvv以及卡号等重要信息
     * @param password
     * @param id
     * @return
     */
    InfinityCardDetailsResponse cardImportantInfo(String password, Long id);

    /**
     * 量子钱包->预付卡
     * @param bo
     * @return
     */
    boolean InfinityCardTransferIn(InfinityCardTransferBO bo);

    /**
     * 预付卡->量子钱包
     * @param bo
     * @return
     */
    boolean prepaidCardTransferOut(InfinityCardTransferBO bo);

    /**
     * 预算组增加预算
     * @param bo
     * @return
     */
    boolean increaseBudget(BudgetChangeBO bo);

    /**
     * 预算组减少预算
     * @param bo
     * @return
     */
    boolean decreaseBudget(BudgetChangeBO bo);

    /**
     * 预算组交易记录
     * @param id
     * @param pageQuery
     * @return
     */
    TableDataInfo<CustomInterlaceBudgetTransactionVO> budgetTransactionPageList(Long id, PageQuery pageQuery);

    /**
     * 预算组下面的预算卡列表
     * @param id
     * @return
     */
    List<InterlaceInfinityCardVO> budgetCardList(Long id);

    /**
     * 预付卡列表
     * @return
     */
    List<InterlaceInfinityCardVO> prepaidCardList();

    /**
     * 卡交易列表（首页使用）
     * @param pageQuery
     * @return
     */
    TableDataInfo<CustomInterlaceCardTransactionVO> cardTransactionPageList(PageQuery pageQuery);

    /**
     * 卡交易详情
     * @param id
     * @return
     */
    CustomInterlaceCardTransactionVO cardTransactionDetail(Long id);

    /**
     * 查询实体卡邮寄信息地址
     * @param cardId
     * @return
     */
    InterlaceShipPhysicalCardsVO getPhysicalCardShipInfo(Long cardId);

    /**
     * 冻结卡
     * @param id
     * @return
     */
    boolean freezeCard(Long id);

    /**
     * 解冻卡
     * @param id
     * @return
     */
    boolean unfreezeCard(Long id);

    /**
     * 创建预算组
     * @param accountId
     * @param uid
     */
    void createBudget(String accountId, Long uid);

    /**
     * 创建持卡人
     * @param accountId
     * @return
     */
    void createCardHolder(String accountId,Long uid);

    /**
     * 卡列表
     * @return
     */
    List<InterlaceInfinityCardVO> cardList();

    /**
     * 卡详情
     * @param id
     * @return
     */
    CustomInterlaceInfinityCardVO cardDetail(Long id);

    /**
     * 获取实体卡制作费用
     * @param bin
     * @return
     */
    PhysicalCardFeesResponse cardProductionFee(String bin);

    /**
     * 开卡申请记录
     * @return
     */
    List<InterlaceCardApplyVO> cardApplyList();

    /**
     * 卡交易记录（分页）
     * @param params
     * @param pageQuery
     * @return
     */
    TableDataInfo<CustomInterlaceCardTransactionVO> transactionPageList(BankCardTxnParams params, PageQuery pageQuery);

    /**
     * 签收实体卡
     * @param id
     * @return
     */
    boolean delivered(Long id);

    /**
     * 删除卡片
     * @param password
     * @param id
     * @return
     */
    boolean delCard(String password, Long id);

    /**
     * 根据cardId获取账单月份统计数据
     * @param cardId
     * @return
     */
    List<InterlaceCardBillStatisticsVO> getBillMonthStatistics(String cardId,String year);

    /**
     * 速度控制
     * @param bo
     * @return
     */
    boolean velocityControl(VelocityControlBO bo);
}
